/*检测是否是数组*/
window.is_array=function(argument){
    return argument && (typeof argument==="object") && ("length" in argument) && (typeof argument.length==="number") ?true : false ;
    /*return ("isArray" in Array) && (Array.isArray(argument))*/
    /*return Object.prototype.toString.call(argument)==="[object Array]"*/
}
/*检测是否是对象*/
window.is_object=function(argument){
    if (argument && (typeof argument==="object") && ("length" in argument)) {
        return Object.prototype.toString.call(argument)==="[object Object]";
    }
    return argument && (typeof argument==="object") && !("length" in argument) ? true : false ;
}
/*检测是否是函数*/
window.is_function=function(argument){
    return argument && typeof argument==="function" ? true : false ;
}
/*检测是否是字符串*/
window.is_string=function(argument){
    return argument && typeof argument==="string" ? true : false ;
}
/*检测是否是布尔值*/
window.is_boolean=function(argument){
    return typeof argument==="boolean" ? true : false ;
}
/*检测是否是数字（数值）*/
window.is_number=function(argument){
    return typeof argument==="number" ? true : false ;
}
/*检测是否是未定义*/
window.is_undefined=function(argument){
    return typeof argument==="undefined" ? true : false;
}
/*检测是否是为空*/
window.is_null=function(argument){
    return argument===null || argument==="" ? true : false;
}
var _this=this;
/*
**@array_or_json array|object 数组或对象 @fun function 回调函数
**@fun回调函数要三个参数表示： 数组（或对象）,下标（key），value
*/
window.foreach=function(array_or_json,fun){
    if (is_array(array_or_json)) {
        if (typeof fun==="function") {
            for(var i=0,len=array_or_json.length;i<len;i++){
                fun(array_or_json,i,array_or_json[i]);
            }
        }

    }
    if (is_object(array_or_json)) {
        if (typeof fun==="function") {
            for(var att in array_or_json){
                fun(array_or_json,att,array_or_json[att]);
            }
        }
    }
}
/*
**随机数	@begin_number number 最小数字 @end_number nunber 最大数字
*/
window.random=function(begin_number,end_number){
    (begin_number) 	|| 	(begin_number=0);
    (end_number)	||	(end_number=10);
    return  (end_number>=begin_number) ? ~~(Math.random()*(end_number-begin_number+1)) + ~~(begin_number) : false ;
}
/*随机字符串*/
window.randomString=function(l,mode,C){
    (l) 	|| (l=5);
    (mode) 	|| (mode="n");
    var value={
        /*数字*/
        n: 		"0123456789"
        /*小写字母*/
        ,s: 	"abcdefghijklmnopqrstuvwxyz"
        /*大写字母*/
        ,S: 	"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        /*数字和小写字母*/
        ,ns: 	"0123456789abcdefghijklmnopqrstuvwxyz"
        /*数字和大写字母*/
        ,nS: 	"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        /*小写字母和大写字母*/
        ,sS: 	"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        /*数字和小写字母和大写字母*/
        ,nsS: 	"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        /*其他字符包括数字小写和大写*/
        ,all: 	"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_+-*=^~,#$@|!"
    };
    if (is_object(C)) {
        foreach(C,function(c,k,v){
            value[k]=v;
        });
    }
    (value[mode]) || (mode="n");
    var str="";
    for(var i=0,str_len=value[mode].length;i<l;i++){
        str+=value[mode][~~(Math.random()*str_len)];
    }
    return str;
}
/*
**给对象添加属性（也可以给标签元素【DOM】对象属性）
**@obj object 对象或者json格式 @json_attribute  object 对象或者json格式
*/
window.set_obj_att=function(obj,json_attribute){
    if( is_object(obj) && is_object(json_attribute)){
        for(var att in json_attribute){
            is_object(json_attribute[att]) ? this.set_obj_att(obj[att]={},json_attribute[att]) : obj[att]=json_attribute[att];
        }
    }
}
/*
*插入元素
*@parentElement object 父元素 @element_name string 要创建的元素名称 @ele_att object(json格式) 设置创建元素的属性
*@refer_node object 兄弟元素(是否把新建的元素节点插入兄弟元素节点的前面,值可以为空) @fun function 回调函数（传入两个参数,值可以为空）
*/
window.insertElement=function(parentElement,element_name,ele_att,refer_node,fun){
    if (parentElement&&element_name) {
        var E=document.createElement(element_name);
        this.set_obj_att(E,ele_att);
        if (is_object(ele_att["myAttribute"])) {
            foreach(ele_att["myAttribute"],function(json,key,value){
                E.setAttribute(key,value);
            });
        }
        (fun&&typeof fun=="function")&&(fun(E,this));
        refer_node ? parentElement.insertBefore(E,refer_node) : parentElement.appendChild(E);
        return true;
    }
    else{
        return false;
    }
}
/*简单给特定的json数据编码为特定的字符串
*@json object 对象，格式为 如：{key:"value",key1:"value1"},键值（属性值）只能为字符串格式
*@C object json格式，配置，设置分割标记字符串 @encode是否编码（encodeURIComponent），默认选择编码（值：true|"false"）
*/
window.en_str_json=function(json,C,encode){
    if (is_object(json)) {
        (encode)||(encode=true);
        (is_object(C))||(C={});
        /*键名和键值的分割标记*/
        (C.key)||(C.key="<=>");
        /*键名与键值跟键名与键值之间的分割标记*/
        (C.k_v)||(C.k_v="<,>");
        var str="";
        var keyL=C.key.length, k_vL=C.k_v.length;
        if (encode===true) {
            foreach(json,function(JSON,key,value){
                str+=key+C.key+encodeURIComponent(value)+C.k_v;
                //str+=key+C.key+(value)+C.k_v;
            });
            return str.substr(0,str.length-k_vL);
        }
        if (encode==="false") {
            foreach(json,function(JSON,key,value){
                str+=key+C.key+value+C.k_v;
            });
            return str.substr(0,str.length-k_vL);
        }
    }
    else{
        return false;
    }
}

window.ajax=function(json,fun){
    if (!is_object(json)) {
        return false;
    }
    (json.methon)||(json.methon="post");
    (json.action)||(json.action="");
    /*josn.jsonp 是否跨域请求*/
    (json.jsonp)||(json.jsonp=false);
    /*json.url 跨域请求的地址*/
    (json.url)	||(json.url="");
    /*设置回调函数名称 看后台接口而定,既设置函数名称的参数，百度的为cb(?cb=functionName)*/
    (json.functionName)||(json.functionName="jsonpData");
    (is_object(json.get))||(json.get={});
    (is_object(json.post))||(json.post={});
    if (json.jsonp===true) {
        insertElement(document.body,"script",{
            type:"text/javascript"
            ,className:"jsonp"
            ,src:json.url+"?functionName="+json.functionName+"&"+this.en_str_json(json.get,{key:"=",k_v:"&"})
        })
        return;
    }
    var xhr=new XMLHttpRequest();
    xhr.open(json.methon,json.action+"?"+this.en_str_json(json.get,{key:"=",k_v:"&"}),true);
    /*console.log(this.en_str_json(json.get,{key:"=",k_v:"&"}));*/
    /*设置请求头部*/
    xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xhr.send(this.en_str_json(json.post,{key:"=",k_v:"&"}));
    xhr.onreadystatechange=function(e){
        if(this.readyState==4&&this.status>=200){
            var texts=this.responseText;
            (typeof fun==="function")&&(fun.call(this,texts));
        }
    }
}

/*
*@time number 时间戳 @formate string 时间格式
*new Date("yyyy/mm/dd hh:ii:ss");
*/
window.dateFormat=function(time,format){
    var T=new Date();
    (time) || (time=T.getTime());
    (format)||(format="Y-M-D H:I:S");
    /*time=parseInt(time);*//*parseInt(time,10);*/
    T.setTime(time);
    var day=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
    var month={
        name:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]
        ,number:[1,2,3,4,5,6,7,8,9,10,11,12]
    }
    var data={
        /*四位数年份*/
        year:T.getFullYear()
        ,Y:T.getFullYear()
        /*月数 月份*/
        ,M:("0"+month.number[T.getMonth()]).slice(-2)
        ,m:month.number[T.getMonth()]
        ,month_name:month.name[T.getMonth()]
        /*星期几*/
        ,day:day[T.getDay()]
        /*天（日）*/
        ,D:("0"+T.getDate()).slice(-2)
        ,d:T.getDate()
        /*时*/
        ,H:("0"+T.getHours()).slice(-2)
        ,h:T.getHours()
        /*分*/
        ,I:("0"+T.getMinutes()).slice(-2)
        ,i:T.getMinutes()
        /*秒*/
        ,S:("0"+T.getSeconds()).slice(-2)
        ,s:T.getSeconds()
    };
    var replace_mode=data;
    foreach(replace_mode,function(obj,key,value){
        var preg=new RegExp(key,"g");
        /* key=key.replace(/\"/g,"\\\"");key=key.replace(/\//g,"\\\/");var preg=eval("/"+key+"/g");*/
        format=format.replace(preg,value);
    });
    return format;
}

/*unicode字符编码*/
window.enUnicode=function(strings){
    var unicode_str="";
    if (strings) {
        for(var i=0,len=strings.length;i<len;i++){
            var s="00"+strings.charCodeAt(i).toString(16);
            /*截取后面4个字符串*/
            s=s.slice(-4);
            unicode_str+="\\u"+s;
        }
        return unicode_str;
    }
    else{
        return false;
    }
}
/*解码unicode编码字符串*/
window.deUnicode=function(strings){
    strings = strings.replace(/\\/g, "%");
    //console.log(strings);
    return unescape(strings);
    /*return decodeURIComponent(strings);*/
}
/*
*@obj object 表单输入元素标签【input,textarea】 @text string 复制的内容(可以为空)
*【注意：input或者textarea的样式不能为 "display:none;" ,主要原理是复制表单元素里面的值（value属性的值）】
*/
window.copyText=function(obj,text){
    if (is_object(obj)) {
        (text)&&(obj.value=text);
        //obj.select();
        currentFocus= document.activeElement;
        obj.focus();
        /*全选对象里面的内容，跟 obj.select()一样*/
        obj.setSelectionRange(0, obj.value.length);
        /*复制选中的文字到剪贴板*/
        document.execCommand('copy', true);
        obj.focus();
        /*currentFocus.focus();*/
        alert("复制成功");
    }
    else{
        return false;
    }
}

/*本地缓存(localStorage或sessionStorage)操作,sessionStorage是关闭当前页面数据就清空 【构造函数】
*@name string 值为(localStorage|sessionStorage),默认localStorage
*/
function storage(name){
    (name)||(name="localStorage");
    this._Storage=window[name]; /* this._Storage=localStorage; 或 this._Storage=sessionStorage;*/
    /*添加或修改localStorage对象或者sessionStorage的属性(键名)内容
    *@key string 键名(对象属性) @value string|object|array 添加或修改的数据 @is_encode boolean 是否给字符串编码(true|false)
    */
    this.set=function(key,value,is_encode){
        /*默认给字符串编码*/
        (is_encode)||(is_encode=false);
        if (!key) {return;}
        if (is_object(value)||is_array(value)) {
            this._Storage.setItem(key, is_encode ? JSON.stringify(value) : encodeURIComponent(JSON.stringify(value)) );
            /*或者这样写: this._Storage[key]= is_encode ? JSON.stringify(value) : encodeURIComponent(JSON.stringify(value)); */
        }
        else{
            this._Storage.setItem(key, is_encode ? value : encodeURIComponent(value) );
        }
        return this;
    }
    /*获取localStorage对象或者sessionStorage对象的属性(键名)内容
    *@key string 键名(对象属性) @decode 是否给字符串解码(true|false)
    */
    this.get=function(key,decode){
        /*默认给字符串解码*/
        (decode)||(decode=false);
        if(!key) {return this._Storage;}
        var copy="",data="";
        copy=data= decode ? this._Storage.getItem(key) : decodeURIComponent(this._Storage.getItem(key));
        /*或者这样写: var data= decode ? this._Storage[key] : decodeURIComponent(this._Storage[key]); */
        try{
            data=JSON.parse(data);
        }
        catch(error){
            console.log("错误！"+error.message);
        }
        return is_object(data)||is_array(data) ? data : copy ;
    }
    /*移除localStorage对象或者sessionStorage对象的属性(键名)内容
    *@key stirng 键名(对象属性) @mode boolean 移除全部属性
    */
    this.remove=function(key,mode){
        /*默认移除指定的localStorage或sessionStorage内容*/
        (key)||(mode=true);
        mode ? this._Storage.clear() : this._Storage.removeItem(key) ;
        return this;
    }
    /*遍历localStorage对象或者sessionStorage对象的属性(键名)内容
    *@fun function 回调函数，传入2个参数【@key (键名),@value (键值)】
    */
    this.foreach=function(fun){
        for(var i=0,len=this._Storage.length;i<len;i++){
            var key=this._Storage.key(i);
            var value=this.get(key);
            is_function(fun)&&fun.call(this,key,value);
        }
        return this;
    }
}

/*标签选择器 @search string 类似css选择器 @parentE object 选择范围*/
window.eleGET=function(search,parentE){
    var allE=is_object(parentE) ? parentE.getElementsByTagName('*') : document.getElementsByTagName('*');
    var preg={
        "class"				: /\.[A-Za-z_][A-Z_a-z0-9\-]*/
        ,"id"				: /#[A-Za-z_][A-Z_a-z0-9\-]*/
        ,"ele"				: /[A-Za-z_][A-Z_a-z0-9\-]*/
        ,"child"			: />/g
        ,"attribute"		: /[\.#A-Za-z_]*[A-Z_a-z0-9\-]*\[[A-Z_a-z0-9\-]+=[!-z\u4e00-\u9fa5]+\]/
        ,"attributePreg"	: /[\.#A-Za-z_]*[A-Z_a-z0-9\-]*\[[A-Z_a-z0-9\-]+\*=[!-z\u4e00-\u9fa5]+\]/
    };
    var fun={
        class : function(){
            if(!preg.class.test(search)){return [];}
            search=search.replace(".","");
            var sE=[],j=0;
            foreach(allE,function(allE,i,value){
                (value.className===search)&&(sE[j]=value)&&(j++);
            });
            return sE;
        }
        ,id : function(){
            if(!preg.id.test(search)){return [];}
            search=search.replace("#","");
            return document.getElementById(search);
        }
        ,ele : function(){
            if(!preg['ele'].test(search)){return [];}
            var sE=[],j=0;
            foreach(allE,function(arr,i,value){
                (value.tagName.toLowerCase()===search.toLowerCase())&&(sE[j]=value)&&(j++);
            });
            return sE;
        }
        ,child : function(){
            // if(!preg['child'].test(search)){return [];}
            search=search.replace(/ /g,"");
            var searchArr=search.split(">");
            var eleContainer=[];
            var arrE=[ fun.screen(allE,searchArr[0]) ];
            var o={
                len:searchArr.length
                ,j:0
                ,i:0
                ,arr:[]
            };
            if(o.len>1){
                for(var i=1,j=0,len=o.len;i<len;i++,j++){
                    var searchs=searchArr[i];
                    (function(i,eArr){
                        foreach(eArr,function(arr1,i1,value1){
                            var childEle=value1.children;
                            childEle=fun.screen(childEle,searchs);
                            foreach(childEle,function(arr2,i2,value2){
                                o.arr[o.i]=value2; o.i++;
                            });
                        });
                    })(i,arrE[j]);
                    arrE[i]=o.arr;
                    o.arr=[]; o.i=0;
                }
            }
            var sE=arrE[o.len-1]; sE.type="child"; sE.getAll=arrE;
            return sE;

        }
        ,attribute : function(){
            //if(!preg['attribute'].test(search)){return [];}
            search=search.replace(/ /g,"");
            var l=search.split(/\[[A-Z_a-z0-9\-]+=[!-z\u4e00-\u9fa5]+\]/)[0];
            var r=search.match(/\[[A-Z_a-z0-9\-]+=[!-z\u4e00-\u9fa5]+\]?/g)[0];
            var r1=r;
            r=r.replace(/( |\[|\])/g,"");
            var k_v=r.split('=');
            var sE=[],o={j:0};
            // console.log(l,r,k_v[0],k_v[1])
            if (l) {
                // var select=this.eleGET(l);
                var select=fun.screen(allE,l);
                sE=fun.screen(select,r1);
            }
            else{
                foreach(allE,function(arr,i,value){
                    (value.getAttribute(k_v[0])===k_v[1])&&(sE[o.j]=value)&&(o.j++);
                });
            }
            return sE;

        }
        ,attributePreg : function(){
            search=search.replace(/ /g,"");
            var l=search.split(/\[[A-Z_a-z0-9\-]+\*=[!-z\u4e00-\u9fa5]+\]/)[0];
            var r=search.match(/\[[A-Z_a-z0-9\-]+\*=[!-z\u4e00-\u9fa5]+\]?/g)[0];
            var r1=r;
            r=r.replace(/( |\[|\])/g,"");
            var k_v=r.split('*=');
            var sE=[],o={j:0};
            // var preg=new RegExp(k_v[1]);
            // console.log(l,r,k_v[0],k_v[1])
            if (l) {
                var select_ele=fun.screen(allE,l);
                // console.log(select_ele,r1)
                sE=fun.screen(select_ele,r1);
                // console.log(sE);
            }
            else{
                sE=fun.screen(allE,r1);
            }
            return sE;
        }
        /*元素标签筛选*/
        ,screen : function(eleArr,search){
            if (!is_array(eleArr)) {return [];}
            var sE=[],o={j:0};
            if( /\[[A-Z_a-z0-9\-]+\*=[!-z\u4e00-\u9fa5]+\]/.test(search) ){
                var r=search.match(/\[[A-Z_a-z0-9\-]+\*=[!-z\u4e00-\u9fa5]+\]?/g)[0];
                r=r.replace(/( |\[|\])/g,"");
                var k_v=r.split("*=");
                // console.log("screen::",k_v[0],k_v[1])
                var pre=new RegExp(k_v[1]);
                foreach(eleArr,function(arr,i,value){
                    ( (pre.test(value[k_v[0]]))||(pre.test(value.getAttribute(k_v[0])) ) )&&(sE[o.j]=value)&&(o.j++);
                });
            }
            else if( /\[[A-Z_a-z0-9\-]+=[!-z\u4e00-\u9fa5]+\]/.test(search) ){
                var r=search.match(/\[[A-Z_a-z0-9\-]+=[!-z\u4e00-\u9fa5]+\]?/g)[0];
                r=r.replace(/( |\[|\])/g,"");
                var k_v=r.split("=");
                foreach(eleArr,function(arr,i,value){
                    ( (value[k_v[0]]===k_v[1])||(value.getAttribute(k_v[0])===k_v[1]) )&&(sE[o.j]=value)&&(o.j++);
                });
            }
            else if (preg.id.test(search)) {
                search=search.replace("#","");
                foreach(eleArr,function(arr,i,value){
                    (value.id===search)&&(sE[o.j]=value)&&(o.j++);
                });
            }
            else if(preg.class.test(search)){
                search=search.replace(".","");
                foreach(eleArr,function(arr,i,value){
                    (value.className===search)&&(sE[o.j]=value)&&(o.j++);
                });
            }
            else{
                foreach(eleArr,function(arr,i,value){
                    (value.tagName.toLowerCase()===search.toLowerCase())&&(sE[o.j]=value)&&(o.j++);
                });
            }
            return sE;

        }
    };
    if (preg.child.test(search)) {
        return fun.child.call(this);
    }
    else if (preg.attribute.test(search)) {
        return fun.attribute.call(this);
    }
    else if(preg.attributePreg.test(search)){
        return fun.attributePreg.call(this);
    }
    else if(preg.id.test(search)){
        return fun.id.call(this);
    }
    else if(preg.class.test(search)){
        return fun.class.call(this);
    }
    else{
        return fun.ele.call(this);
    }
}

/*监听对象属性值的变化和属性的获取
*@obj object 要监听的对象 @key string 对象的属性（键名）
*@getfun function 获取对象属性值要执行的回调函数(可以不填) @setfun function 改变对象属性值时要执行的回调函数（方法，可以不填）
*/
window.attributeListener=function(obj,key,getfun,setfun){
    var o={
        /*value:""*/
        /*,writable : true*/
        /*,configurable : true*/
        /*,enumerable : true*/

        /*监听对象属性被获取时 get属性是自带的*/
        get: function(){
            is_function(getfun)&&getfun.call(obj,obj["_"+key]);
            return obj["_"+key];
        }
        /*监听对象属性值改变 set属性是自带的，是一个回调函数，传入一个值（即有一个参数）*/
        ,set: function(newValue){
            /*data=newValue;*/
            console.log("set:"+newValue+"--"+arguments[0]+"--"+arguments[1]);
            is_function(setfun)&&setfun.call(obj);
            obj["_"+key]=newValue;
            /*alert("更新的数据："+newValue);*/
        }
    }
    Object.defineProperty(obj,key,o);
    /*Object.defineProperty.call(obj,obj,key,o);*/
}

/*
*动画
*/
function plug_move(){
    /*
    *t  当前时间 (time) 初始时间
    *b  初始位置 (beginning position)		(固定)
    *c  距离 (change position) 运动的距离	(固定)
    *d  持续时间 (duration)运动多少时间		(固定)
    *p  最终位置 (position)
    */
    var _obj=this;
    this.getCSS=function(obj,style_attr){
        return window.getComputedStyle ? getComputedStyle(obj)[style_attr] : obj.currentStyle[style_attr] ;
    }
    this.move_time={
        /*
        *tween算法 (基于时间的动画)
        */
        linear:function(t,b,c,d){ 			//匀速
            return c*t/d + b; //kx+b
        }
        ,easeIn: function(t, b, c, d){  	//加速曲线 ease前进的意思
            return c*(t/=d)*t + b;
        }
        ,easeOut: function(t, b, c, d){  	//减速曲线
            return -c *(t/=d)*(t-2) + b;
        }
        ,easeBoth: function(t, b, c, d){  	//加速减速曲线
            if ((t/=d/2) < 1) {
                return c/2*t*t + b;
            }
            return -c/2 * ((--t)*(t-2) - 1) + b;
        }
        ,easeInStrong: function(t, b, c, d){  //加加速曲线
            return c*(t/=d)*t*t*t + b;
        }
        ,easeOutStrong: function(t, b, c, d){  //减减速曲线
            return -c * ((t=t/d-1)*t*t*t - 1) + b;
        }
        ,easeBothStrong: function(t, b, c, d){  //加加速减减速曲线
            if ((t/=d/2) < 1) {
                return c/2*t*t*t*t + b;
            }
            return -c/2 * ((t-=2)*t*t*t - 2) + b;
        }
        ,elasticIn: function(t, b, c, d, a, p){  //正弦衰减曲线（弹动渐入）
            if (t === 0) {
                return b;
            }
            if ( (t /= d) == 1 ) {
                return b+c;
            }
            if (!p) {
                p=d*0.3;
            }
            if (!a || a < Math.abs(c)) {
                a = c;
                var s = p/4;
            } else {
                var s = p/(2*Math.PI) * Math.asin (c/a);
            }
            return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
        }
        ,elasticOut: function(t, b, c, d, a, p){    //正弦增强曲线（弹动渐出）
            if (t === 0) {
                return b;
            }
            if ( (t /= d) == 1 ) {
                return b+c;
            }
            if (!p) {
                p=d*0.3;
            }
            if (!a || a < Math.abs(c)) {
                a = c;
                var s = p / 4;
            } else {
                var s = p/(2*Math.PI) * Math.asin (c/a);
            }
            return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
        }
        ,elasticBoth: function(t, b, c, d, a, p){
            if (t === 0) {
                return b;
            }
            if ( (t /= d/2) == 2 ) {
                return b+c;
            }
            if (!p) {
                p = d*(0.3*1.5);
            }
            if ( !a || a < Math.abs(c) ) {
                a = c;
                var s = p/4;
            }
            else {
                var s = p/(2*Math.PI) * Math.asin (c/a);
            }
            if (t < 1) {
                return - 0.5*(a*Math.pow(2,10*(t-=1)) *
                    Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
            }
            return a*Math.pow(2,-10*(t-=1)) *
                Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b;
        }
        ,backIn: function(t, b, c, d, s){     //回退加速（回退渐入）
            if (typeof s == 'undefined') {
                s = 1.70158;
            }
            return c*(t/=d)*t*((s+1)*t - s) + b;
        }
        ,backOut: function(t, b, c, d, s){
            if (typeof s == 'undefined') {
                s = 3.70158;  //回缩的距离
            }
            return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
        }
        ,backBoth: function(t, b, c, d, s){
            if (typeof s == 'undefined') {
                s = 1.70158;
            }
            if ((t /= d/2 ) < 1) {
                return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
            }
            return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
        }
        ,bounceIn: function(t, b, c, d){    //弹球减振（弹球渐出）
            return c - this['bounceOut'](d-t, 0, c, d) + b;
        }
        ,bounceOut: function(t, b, c, d){
            if ((t/=d) < (1/2.75)) {
                return c*(7.5625*t*t) + b;
            } else if (t < (2/2.75)) {
                return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b;
            } else if (t < (2.5/2.75)) {
                return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b;
            }
            return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b;
        }
        ,bounceBoth: function(t, b, c, d){
            if (t < d/2) {
                return this['bounceIn'](t*2, 0, c, d) * 0.5 + b;
            }
            return this['bounceOut'](t*2-d, 0, c, d) * 0.5 + c*0.5 + b;
        }
        /*调用该函数 方法（move）执行动画*/
        ,move:function(obj,json_att,times,mode,is_scroll,fun){
            (!times)&&(times=500);
            (!mode)&&(mode="easeOut");
            if ((!obj && !json_att) && typeof obj!="object" && typeof json_att!="object") {return false;}
            //var previous=new Date();//以前的时间
            var current=new Date();//现在的时间
            /*获取初始值*/
            var iCur={};
            for(var att in json_att){
                if (is_scroll) {/*滚动条*/
                    iCur[att]=obj[att];
                }
                else{
                    att==="opacity" ? iCur[att] = Math.round(_obj.getCSS(obj,att)*100) : iCur[att] = parseInt(_obj.getCSS(obj,att));
                }
            }
            /*先清除上一个定时器*/
            //clearTimeout(this.Timeout);
            clearInterval(obj.Timeout);
            this.m=function(){
                /*获取t、d参数*/
                var d=times;
                var t=d-Math.max(0,current-(+new Date())+d);
                for(var attr in json_att){
                    /*获取b、c、p这三个参数*/
                    var b=iCur[attr];
                    var c=json_att[attr]-iCur[attr];
                    var p=_obj.move_time[mode](t,b,c,d);
                    /*赋值操作*/
                    if (is_scroll) {
                        obj[attr]=p;
                    }
                    else{
                        if (attr=="opacity") {
                            obj.style.opacity = p / 100;
                            obj.style.filter = 'alpha(opacity=' + p + ')';
                        }
                        else{
                            obj.style[attr] = p + 'px';
                        }
                    }

                }
                //obj.Timeout=setInterval(this.m,1000/60);
                //console.log(times,t,d);
                if (t==d) {
                    /*清除定时器*/
                    clearInterval(obj.Timeout);
                    fun && fun.call(obj);
                }
            }
            //this.Timeout=setTimeout(this.m,1000/60);
            obj.Timeout=setInterval(this.m,1000/60);
            //this.m.call(this);
        }
    };
    this.move=function(obj,json_att,times,mode,is_scroll,fun){
        this.move_time.move(obj,json_att,times,mode,is_scroll,fun);
    }
    /*函数里面的函数 里面的this默认指向window对象*/
    /*json_att,是一个一维对象,存放结束的位置,属性对应着传入的对象的运动属性*/
    /*示例： var move=new plug_move();  move.move(obj,{width:xxx,att2:xx..},500,"linear");*/
}

/**
 * js动画 构造函数
 * @obj object 要运动的对象
 * @json_attr object 运动对象的属性(键名)的终点位置
 * @times number 动画时间 （默认时间为 500 毫秒）
 * @move_type string 运动曲线名称（可以为空，默认值是 easeOut）
 * @is_scroll boolem|0|1 对象属性是否是无单位（可以为空，默认存在单位）
 * @fun function 动画完成后的回调函数（可以为空）
*/
function animation(){
    var tween={
        /*
        *tween算法 (基于时间的动画)
        */
        linear:function(t,b,c,d){           //匀速
            return c*t/d + b; //kx+b
        }
        ,easeIn: function(t, b, c, d){      //加速曲线 ease前进的意思
            return c*(t/=d)*t + b;
        }
        ,easeOut: function(t, b, c, d){     //减速曲线
            return -c *(t/=d)*(t-2) + b;
        }
        ,easeBoth: function(t, b, c, d){    //加速减速曲线
            if ((t/=d/2) < 1) {
                return c/2*t*t + b;
            }
            return -c/2 * ((--t)*(t-2) - 1) + b;
        }
        ,easeInStrong: function(t, b, c, d){  //加加速曲线
            return c*(t/=d)*t*t*t + b;
        }
        ,easeOutStrong: function(t, b, c, d){  //减减速曲线
            return -c * ((t=t/d-1)*t*t*t - 1) + b;
        }
        ,easeBothStrong: function(t, b, c, d){  //加加速减减速曲线
            if ((t/=d/2) < 1) {
                return c/2*t*t*t*t + b;
            }
            return -c/2 * ((t-=2)*t*t*t - 2) + b;
        }
        ,elasticIn: function(t, b, c, d, a, p){  //正弦衰减曲线（弹动渐入）
            if (t === 0) {
                return b;
            }
            if ( (t /= d) == 1 ) {
                return b+c;
            }
            if (!p) {
                p=d*0.3;
            }
            if (!a || a < Math.abs(c)) {
                a = c;
                var s = p/4;
            } else {
                var s = p/(2*Math.PI) * Math.asin (c/a);
            }
            return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
        }
        ,elasticOut: function(t, b, c, d, a, p){    //正弦增强曲线（弹动渐出）
            if (t === 0) {
                return b;
            }
            if ( (t /= d) == 1 ) {
                return b+c;
            }
            if (!p) {
                p=d*0.3;
            }
            if (!a || a < Math.abs(c)) {
                a = c;
                var s = p / 4;
            } else {
                var s = p/(2*Math.PI) * Math.asin (c/a);
            }
            return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
        }
        ,elasticBoth: function(t, b, c, d, a, p){
            if (t === 0) {
                return b;
            }
            if ( (t /= d/2) == 2 ) {
                return b+c;
            }
            if (!p) {
                p = d*(0.3*1.5);
            }
            if ( !a || a < Math.abs(c) ) {
                a = c;
                var s = p/4;
            }
            else {
                var s = p/(2*Math.PI) * Math.asin (c/a);
            }
            if (t < 1) {
                return - 0.5*(a*Math.pow(2,10*(t-=1)) *
                    Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
            }
            return a*Math.pow(2,-10*(t-=1)) *
                Math.sin( (t*d-s)*(2*Math.PI)/p )*0.5 + c + b;
        }
        ,backIn: function(t, b, c, d, s){     //回退加速（回退渐入）
            if (typeof s == 'undefined') {
                s = 1.70158;
            }
            return c*(t/=d)*t*((s+1)*t - s) + b;
        }
        ,backOut: function(t, b, c, d, s){
            if (typeof s == 'undefined') {
                s = 3.70158;  //回缩的距离
            }
            return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
        }
        ,backBoth: function(t, b, c, d, s){
            if (typeof s == 'undefined') {
                s = 1.70158;
            }
            if ((t /= d/2 ) < 1) {
                return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
            }
            return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
        }
        ,bounceIn: function(t, b, c, d){    //弹球减振（弹球渐出）
            return c - this['bounceOut'](d-t, 0, c, d) + b;
        }
        ,bounceOut: function(t, b, c, d){
            if ((t/=d) < (1/2.75)) {
                return c*(7.5625*t*t) + b;
            } else if (t < (2/2.75)) {
                return c*(7.5625*(t-=(1.5/2.75))*t + 0.75) + b;
            } else if (t < (2.5/2.75)) {
                return c*(7.5625*(t-=(2.25/2.75))*t + 0.9375) + b;
            }
            return c*(7.5625*(t-=(2.625/2.75))*t + 0.984375) + b;
        }
        ,bounceBoth: function(t, b, c, d){
            if (t < d/2) {
                return this['bounceIn'](t*2, 0, c, d) * 0.5 + b;
            }
            return this['bounceOut'](t*2-d, 0, c, d) * 0.5 + c*0.5 + b;
        }        
    };

    var self=this; var _this=this;
    this.getName=function(name){
        var arr=[],i=0;
        for(var attr in tween){
            arr[i]=attr;
            i++;
        }
        return arr.indexOf(name)==-1 ? arr : name; 
    }
    this.autoType=function(name){
        if (is_array(name)) {return name[~~(Math.random()*(name.length))]; }
        var v=self.getName(name);
        return is_array(v) ? v[~~(Math.random()*(v.length))] : v;
    }
    this.getCSS=function(obj,style_attr){
        return window.getComputedStyle ? getComputedStyle(obj)[style_attr] : obj.currentStyle[style_attr] ;
    }
    this.move=function(obj,json_attr,times,move_type,is_scroll,fun){
        // 默认动画时间为500毫秒
        (!times)&&(times=500);
        // 默认运动曲线（方式）
        (!move_type)&&(move_type="easeOut");
        if ((!obj && !json_attr) && typeof obj!="object" && typeof json_attr!="object") {return false;}
        //var previous=new Date();//以前的时间
        var current=new Date();//现在的时间
        /*获取初始值*/
        var iCur={};
        for(var att in json_attr){
            if (is_scroll) {/*滚动条*/
                iCur[att]=obj[att];
            }
            else{
                att==="opacity" ? iCur[att] = Math.round(self.getCSS(obj,att)*100) : iCur[att] = parseInt(self.getCSS(obj,att));
            }
        }
        function action(){
            /*获取t、d参数*/
            var d=times;
            var t=d-Math.max(0,current-(+new Date())+d);
            for(var attr in json_attr){
                /*获取b、c、p这三个参数*/
                var b=iCur[attr];
                var c=json_attr[attr]-iCur[attr];
                var p=tween[move_type](t,b,c,d);
                // var p=tween[self.autoType(move_type)](t,b,c,d);
                /*赋值操作*/
                if (is_scroll) {
                    obj[attr]=p;
                }
                else{
                    if (attr=="opacity") {
                        obj.style.opacity = p / 100;
                        obj.style.filter = 'alpha(opacity=' + p + ')';
                    }
                    else{
                        obj.style[attr] = p + 'px';
                    }
                }

            }
            //console.log(times,t,d);
            if (t==d) {
                /*清除定时器*/
                clearInterval(obj.intervalID);
                fun && fun.call(obj);
            }            
        }
        clearInterval(obj.intervalID);
        obj.intervalID=setInterval(action ,1000/60);
    }
    this.automove=function(obj,json_attr,times,move_type,is_scroll,fun){
        // 默认动画时间为500毫秒
        (!times)&&(times=500);
        if ((!obj && !json_attr) && typeof obj!="object" && typeof json_attr!="object") {return false;}
        //var previous=new Date();//以前的时间
        var current=new Date();//现在的时间
        /*获取初始值*/
        var iCur={};
        for(var att in json_attr){
            if (is_scroll) {/*滚动条*/
                iCur[att]=obj[att];
            }
            else{
                att==="opacity" ? iCur[att] = Math.round(self.getCSS(obj,att)*100) : iCur[att] = parseInt(self.getCSS(obj,att));
            }
        }
        var type=self.autoType(move_type);
        function action(){
            /*获取t、d参数*/
            var d=times;
            var t=d-Math.max(0,current-(+new Date())+d);
            for(var attr in json_attr){
                /*获取b、c、p这三个参数*/
                var b=iCur[attr];
                var c=json_attr[attr]-iCur[attr];
                var p=tween[type](t,b,c,d);
                // var p=tween[self.autoType(move_type)](t,b,c,d);
                /*赋值操作*/
                if (is_scroll) {
                    obj[attr]=p;
                }
                else{
                    if (attr=="opacity") {
                        obj.style.opacity = p / 100;
                        obj.style.filter = 'alpha(opacity=' + p + ')';
                    }
                    else{
                        obj.style[attr] = p + 'px';
                    }
                }

            }
            //console.log(times,t,d);
            if (t==d) {
                /*清除定时器*/
                clearInterval(obj.intervalID);
                fun && fun.call(obj);
            }            
        }
        clearInterval(obj.intervalID);
        obj.intervalID=setInterval(action ,1000/60);
    }
}
/**
 * 代替用户点击操作事件 ele.click(); 这个是直接触发点击事件的(相当与用户点击了改元素标签)
 */

function inputFileSelect(inputEle) {
    if (is_object(inputEle)){
        inputEle.click();
    }
    else{
        try {
            eleGET(inputEle)[0].click();
        }catch (e) {
            console.log(e);
        }
    }
}
function EventUtil() {
    this.add = function (element,eventType,fn,boolean) {
        (boolean) || (boolean = false);
        element[eventType + "event_fn"] = fn;
        if (element.addEventListener) {
            element.addEventListener(eventType,element[eventType+"event_fn"],boolean);
        }else if (element.attachEvent){
            element.attachEvent("on"+eventType,element[eventType+"event_fn"]);
        }else{
            element["on"+eventType]=fn;
        }
    }
    this.remove = function (element,eventType,boolean) {
        (boolean) || (boolean = false);
        if (element.removeEventListener) {
            element.removeEventListener(eventType,element[eventType+"event_fn"], boolean);
        }else if (element.detachEvent){
            element.detachEvent("on" + eventType,element[eventType+"event_fn"]);
        } else{
            element["on"+eventType] = null;
        }
    }
    this.getEvent=function (event) {
        return event ? event : window.event;
    }
    this.getTarget=function (event) {
        return event ? event.target : event.srcElement;
    }
    this.preventDefault=function (event) {
        if (event.preventDefault) {
            event.preventDefault();
        }else{
            event.returnValue = false;
        }
    }
    this.stopPropagation = function (event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        }else {
            event.cancelBubble = true;
        }

    }
}
EventUtil.prototype = {
    win:window
};

var LO=new storage();
var SE=new storage("sessionStorage");
// var MOVE=new plug_move();
var move=new animation();
var Events = new EventUtil();